//
// Created by twetec on 25-6-21.
//

#ifndef NETWORK_PROBER_DATABASE_FILE_DB_HOLDER_H
#define NETWORK_PROBER_DATABASE_FILE_DB_HOLDER_H

#include <duckdb.h>

#include "file_db_model.h"

namespace network_prober::database
{
class FileDBHolder
{
public:
    void init();                       // 初始化
    static FileDBHolder &getInstance(); // 获取实例

    /**
     * 批量新增观测任务结果
     */
    void batchInsertProbeTaskResults(std::span<ProbeTaskResultModel> probeTaskResults);

    /**
     * 删除指定观测目标的任务结果
     */
    void batchRemoveProbeTaskResultsByTargetUUID(std::string_view uuid);

    /**
     * 删除所有观测记录
     */
    void batchRemoveAllProbeTaskResults();

    /**
     * 根据观测设备标识和时间段，获取对应的观测结果
     */
    std::vector<ProbeTaskResultModel> getProbeTaskResultsByUUIDsAndStartEndTime(const std::vector<std::string>& uuids, std::string_view startTime, std::string_view endTime);

private:
    void _initProbeTaskResultTable();

    FileDBHolder();  // 构造函数私有化
    ~FileDBHolder(); // 析构函数私有化

    FileDBHolder(const FileDBHolder &) = delete;            // 禁用默认拷贝构造函数（初始化赋值时调用）
    FileDBHolder &operator=(const FileDBHolder &) = delete; // 禁用默认拷贝赋值（初始化后，再赋值时调用）

    FileDBHolder(FileDBHolder &&) = delete;            // 针对右值
    FileDBHolder &operator=(FileDBHolder &&) = delete; // 针对右值

private:
    duckdb_database m_db;
};
}

#endif //NETWORK_PROBER_DATABASE_FILE_DB_HOLDER_H
